home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 2
/
Gekikoh Dennoh Club Vol. 2 (Japan).7z
/
Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin
/
fsw
/
mcdrv
/
mccall.doc
< prev
next >
Wrap
Text File
|
1996-05-01
|
16KB
|
775 lines
───────────────────────────────
MCDRV
Music Creative driver for X680x0
【 サービスコールの解説 】
───────────────────────────────
written by CUL. (1996-04-10)
───────────────────────────────────────
始めに
───────────────────────────────────────
MCDRV では基本的に TRAP4 を使って多種のサービスをします。呼び出し方は、
moveq.l #サービス番号,d0
trap #4
の様にします。d0 レジスタの値は、サービス終了後には破壊されるものとしてプロ
グラムして下さい。
また、エラーコードを返すようなコールの場合、戻り値が負ならエラーになります。
───────────────────────────────────────
MCDRV サービスコール
───────────────────────────────────────
----------------------------------------
$00 MCDRV 常駐解除
----------------------------------------
_RELEASE MCDRV を常駐解除します
引数: なし
戻値: d0.l エラーコード
----------------------------------------
$01 MDC データ転送
----------------------------------------
_TRANSMDC MDC データをドライバに転送します
引数: a0 データの格納されているアドレス
d1.l データのサイズ
(特殊処理)
d1=0 データを転送しません。データポインタがそのデータ先頭を指すだけ
です。
(次の演奏指示時にそのデータを演奏します)
データは固定しておいて下さい。処理内容がわからなければ使わない
で下さい。
d1=1~4 予約
a0=0 d1.l で示されるサイズ分だけバッファを確保します。
ディスクからデータを直接読み込む場合等に使用します。
演奏前には、必ずデータをロードしておいて下さい。
d1=a0=0 ドライバのワークを初期化します
戻値: d0.l データ先頭へのポインタ
負:エラーコード
----------------------------------------
$02 演奏開始
----------------------------------------
_PLAYMUSIC セッティングと演奏開始
引数: なし
戻値: d0.l エラーコード
演奏開始は必ず $05 _STOPMUSIC をコールしてから本コールを行なっ
てください。
----------------------------------------
$03 ADPCM データ転送
----------------------------------------
_TRANSPCM ADPCM データセット
引数: a0 データの格納されているアドレス
d1.l データのサイズ
(特殊処理)
_TRANSMDC の特殊処理とほぼ同じです。
戻値: d0.l データ先頭へのポインタ
負:エラーコード
----------------------------------------
$04 演奏一時停止
----------------------------------------
_PAUSEMUSIC 演奏を一時停止状態にする
引数: なし
戻値: なし
----------------------------------------
$05 演奏停止
----------------------------------------
_STOPMUSIC 演奏を停止する
引数: なし
戻値: なし
----------------------------------------
$06 ワークアドレスの取得
----------------------------------------
_GETWORKADR
引数: なし
戻値: d0.l MCDRV ワークエリアへのアドレス
----------------------------------------
$07 トラックステータスの取得
----------------------------------------
_GETTRACKSTAT 使用禁止
引数: d1 知りたいトラック番号
a0 格納するバッファのアドレス
戻値: d0.l エラーコード
0(a0) 未定
:
----------------------------------------
$08 ベクタテーブルの先頭アドレス取得
----------------------------------------
_GETVCTTBLADR
引数: 無し
戻値: d0.l ベクタテーブルの先頭アドレス
----------------------------------------
$09 キーオン情報
----------------------------------------
_GETKEYONPTR
引数: 無し
戻値: d0.l キーオン情報へのアドレス
ofst 内容
$00 FIFO の管理ポインタ
$02 FIFO バッファ先頭 (FIFO buffer = 1024byte)
----------------------------------------
$0a カレントデータ格納アドレス取得
----------------------------------------
_GETCURDATAPTR
引数: 無し
戻値: d0 カレントデータの格納アドレス
0:データが入っていない
ファイル構造そのものが入っていますので、タイトルやファイルサイズなどさまざま
な情報を取得することができます。
(ファイル構造などは MCFORM.DOC 参照)
----------------------------------------
$0b 演奏トラックのフラグ取得
----------------------------------------
_GETPLAYFLG
引数: 無し
戻値: d0.l TRACK 0 ~ TRACK31 ビットマップ (1=play)
d1.l TRACK31 ~ TRACK63 〃
----------------------------------------
$0c トランスポーズ値設定
----------------------------------------
_SETTRANSPOSE
引数: d1.w b0~7 値 (-127~127)
b8~15 $00 値を設定値から加減算し使用します
$ff 値をそのまま使用します
戻値: d0.b トランスポーズ値
----------------------------------------
$0d ループ回数の取得
----------------------------------------
_GETLOOPCOUNT
引数: 無し
戻値: d0.w 演奏開始からのループ回数
$ffff:演奏は終了した
----------------------------------------
$0e 演奏開始からの経過クロック取得
----------------------------------------
_GETNOWCLOCK
引数: 無し
戻値: d0.l 演奏開始からの経過クロック取得
d1.l 総クロック数
-1:総クロック情報がない
----------------------------------------
$0f 演奏指定中データのタイトル取得
----------------------------------------
_GETTITLE
引数: 無し
戻値: d0.l タイトルデータへのアドレス
----------------------------------------
$10 現在演奏中の曲中のコメント取得
----------------------------------------
_GETCOMMENT
引数: 無し
戻値: d0.l コメントデータへのアドレス
----------------------------------------
$11 割り込み中サブルーチン実行
----------------------------------------
_INTEXEC
引数: a0 jsr するアドレス
戻値: d0.l エラーコード
MCDRV の割り込み処理中に、他の割り込みから _PLAYMUSIC 等の演奏状態を変更する
コールが実行されると、MCDRV の処理に戻った時に暴走する場合があります。
本コールはこのような危険性のある処理を安全なタイミングで実行するために設けら
れています。
実行されるのは1回のみで、MCDRV の割り込み処理が終わる直前に実行されます。
a6(ワークエリア) 以外のレジスタ内容は不定です。
d0-d7/a0-a6 の内容は破壊しても構いません。
----------------------------------------
$12 サブイベントセット
----------------------------------------
_SETSUBEVENT
引数: d1.w MODE
0: 登録IDを参照し登録済みなら登録されたアドレスを d0.l に
未登録ならエラーコードを d0.l に返します。
1: 登録IDを参照し登録済みならエラーコードを返し、
未登録なら a0 の指し示すアドレスと ID を登録します。
2: 登録IDを参照し未登録ならエラーコードを返し、
登録済みなら登録されたアドレスを d0.l に返し、登録を解除します。
d2.l 登録ID (例) 'MCAP' など
a0 jsr するアドレス (MODE=1 のみ)
戻値: d0.l 負:エラーコード
特定のイベントが発生すると、MCDRV は d0.l にイベント番号を入れてサブルーチン
コールします。
d0.l 0 NULL (他のプログラムがイベントを専有した等)
1 ループカウントが発生した (d1.w:ループ回数)
2 演奏が終了した
3 演奏が開始された
4 演奏が一時停止された
5 フェードアウトが完了した
6 フェードインが完了した
7 演奏時間で1秒が経過した (d1.l:_GETPASSTIMEの戻り値と同様)
負 MCDRV が解除される
レジスタの値は保存して次のプログラムに渡すようにします。
イベントは8個まで登録できます。
----------------------------------------
$13 ドライバ解除制御
----------------------------------------
_UNREMOVE
引数: d1.w 0 何もしません
1 解除禁止 (UNREMOVE フラグを +1 します)
-1 解除許可 (UNREMOVE フラグを -1 します)
戻値: d0.w UNREMOVE 呼び出し回数 (v0.66~)
UNREMOVE フラグが0の時のみ常駐解除ができます。
(例) プログラムの流れ →
禁止(+1) 禁止(+1) 許可(-1) = +1 ・・・ 解除できない
禁止/許可はそれぞれ1回ずつコールするようにして下さい。
----------------------------------------
$14 フェードアウト開始
----------------------------------------
_FADEOUT
引数: d1.w フェードアウトスピード (-255~255)
正:フェードアウト
負:フェードイン
0:フェーダー停止
戻値: なし
----------------------------------------
$15 パラメータ変更要求
----------------------------------------
_SETPARAM
引数: d3.w トラック番号 (0~127)
d2.w パラメータ種類 (15,14)
d1.l 値 (bit31=1の時相対値による設定)
パラメータ種類
0~13 未登録
14 パンポット
15 プログラム
----------------------------------------
$16 テンポ値取得
----------------------------------------
_GETTEMPO
引数: なし
戻値: d0.l hw 4分音符あたりの分解能
lw 音楽的テンポ値
----------------------------------------
$17 演奏開始からの経過時間取得
----------------------------------------
_GETPASSTIME
引数: なし
戻値: d0.l hw 分 (0~65535)
lw 秒 (0~59)
----------------------------------------
$18 スキップ演奏
----------------------------------------
_SKIPPLAY
引数: d1.l スキップするクロック
戻値: なし
----------------------------------------
$1c ADPCM名登録
----------------------------------------
_SETADPCMNAME
引数: a0 ファイル名へのポインタ
戻値: なし
----------------------------------------
$1d ADPCM名取得
----------------------------------------
_GETADPCMNAME
引数: なし
戻値: d0.l ファイル名へのポインタ
----------------------------------------
$1e ADPCM名比較
----------------------------------------
_CMPADPCMNAME
引数: a0 ファイル名へのポインタ
戻値: d0.l 正:ドライバ内に同じファイル名のデータが存在する
負: 〃 しない
----------------------------------------
$1f トラックワークサイズの取得
----------------------------------------
_GETTRWORKSIZE
引数: なし
戻値: d0.w 1つのトラックワークのサイズ
----------------------------------------
$20 効果音演奏
----------------------------------------
_PLAYSE
引数: a0 MDCデータ先頭のアドレス
戻値: なし
トラック <-> チャンネルのアサイン等は、ドライバが自動的に
処理しますので、ユーザーが管理する必要はありません。
----------------------------------------
$21 効果音停止
----------------------------------------
_STOPSE
引数: なし
戻値: なし
現在演奏中の効果音を全て停止します。
----------------------------------------
$22 テンポ感度設定
----------------------------------------
_SETTEMPOSNS
引数: d1.w テンポ感度
0 なにもしない (TEMPOSNS 値の呼び出し用)
256 感度 = 100% (通常テンポ)
他 テンポ=テンポ×テンポ感度÷256 に設定
戻値: d0.w 現在の TEMPOSNS 値
なるべく 1 (1/256倍速) ~ 4096 (16倍速) の範囲で使用して下さい。
----------------------------------------
$23 マスターボリューム設定
----------------------------------------
_SETMASTERVOL
引数: d1.w マスターボリューム値 (0~128)
0 消音
128 最大 (標準)
-1 なにもしない (MASTERVOL 値の呼び出し用)
戻値: d0.w 現在の MASTERVOL 値
OPM/ADPCM パートでは 80 辺りで音が聞こえなくなります。
----------------------------------------
$24 フェードレベル設定
----------------------------------------
_SETFADELVL
引数: d1.w フェードレベル (0~128)
0 消音
128 最大 (標準)
-1 なにもしない (FADELVL 値の呼び出し用)
戻値: d0.w 現在の FADELVL 値
OPM/ADPCM/MIDI の音量の関係が保たれます。
FADELVL は _PLAYMUSIC で 128 に初期化されます。
----------------------------------------
$25 MIDIインターフェース設定
----------------------------------------
_SETMIDIIF
引数: d1.l チャンネル $8n~$Fn に割り当てるデバイス番号
bit チャンネル MIDI チャンネル
00~03 $80~$8f 1~16
04~07 $90~$9f 17~32
:
28~31 $f0~$ff 113~128
デバイス番号
0 何も割り当てない
1 MIDI BOARD #1
2 MIDI BOARD #2
3 RS-MIDI
4 POLYPHON-MIDI
5~ 予約
戻値: d0.l 現在の割り当て
動作中にデバイスの再割り当てを行ないます。ゲーム等のコンフィグで、MIDI BOARD
と RS-MIDI を選択する時などに使用します。
常駐時の -I オプションで指定されなかったデバイスについては、本コールを呼び出
しても無視されます。
選択中に曲が演奏されるのなら、以下の様にして切り換えます。
_STOPMUSIC (MIDI の効果音を使っているなら _STOPSE も呼ぶ)
↓
_SETMIDIIF
↓
_PLAYMUSIC
----------------------------------------
$26 MIDIデータ送信
----------------------------------------
_TRANSMIDIDATA
引数: d1.l hw 送信するチャンネル番号
$80~$ff -> MIDI チャンネル 1~128
lw 送信するバイト数
a0 送信する MIDI データを指すポインタ
戻値: なし
----------------------------------------
$27 バッファ領域リンク
----------------------------------------
_MCMLINK
引数: d1.l 追加するバッファのサイズ
a0 追加するバッファのアドレス
戻値: d0.l エラーコード
指定されたバッファにメモリ管理テーブルを作成し、MCDRV のバッファ
にリンクさせます。
16 byte を管理テーブル用に使用しますので、実際に追加されるサイ
ズは引数から 16 を引いた値になります。
----------------------------------------
$28 バッファ領域リンク解除
----------------------------------------
_MCMUNLK
引数: a0 解除するバッファのアドレス
戻値: d0.l エラーコード
指定されたアドレスで示されるバッファを MCDRV のバッファから
解除します。
----------------------------------------
$29 バッファ初期化
----------------------------------------
_PURGE
引数: なし
戻値: なし
演奏を終了し、ドライバが使用しているバッファを全て開放します。
----------------------------------------
$2a メジャーサーチ
----------------------------------------
_SRCHMEAS
引数: d1.w サーチする小節番号
戻値: なし
----------------------------------------
$2b ジャンプ演奏
----------------------------------------
_JUMPPLAY
引数: d1.l 演奏開始からの位置 (クロック)
戻値: なし
----------------------------------------
$2c レベル付き効果音演奏
----------------------------------------
_PLAYSE2
引数: a0 MDCデータ先頭のアドレス
d1.b 効果音レベル 0~127
戻値: なし
_PLAYSE による効果音演奏はレベル0(最低レベル)です。
----------------------------------------
$2d レベル付き効果音停止
----------------------------------------
_STOPSE2 v0.66~
引数: d1.w 効果音レベル (0~127) から
d2.w 効果音レベル (0~127) まで
戻値: なし
----------------------------------------
$2e レベル付き ADPCM 再生 (ADPCM データアドレス指定)
----------------------------------------
_PLAYADPCM v0.66~
引数: d1 b0~7 パンポット
b8~15 周波数
b16~23 レベル
d2.l ADPCM のデータサイズ
a0 ADPCM の格納アドレス (IOCS とはレジスタが違うので注意)
戻値: なし
レベルは符合付きバイトで以下の様になっています。
+127 最優先
:
0 演奏データと同じ
:
-128 最下位
----------------------------------------
$2f レベル付き ADPCM 再生 (ドライバ内番号指定)
----------------------------------------
_PLAYADPCM2 v0.66~
引数: d1 b0~7 パンポット
b8~15 周波数
b16~23 レベル
d2.w ノート番号
戻値: なし
曲データ用としてドライバに登録されている ADPCM を再生します。
番号はデータ内の管理番号なので、MIDI ノート番号に変換する必要はありません。
レベルは _PLAYADPCM と同じです。
----------------------------------------
$30 効果音フェードアウト
----------------------------------------
_FADEOUTSE v0.67~
引数: d1.w フェードアウトスピード (0~255)
d2.b 対象レベル
戻値: なし
0で最速。
───────────────────────────────────────
MCDRV 常駐チェック方法
───────────────────────────────────────
このサブルーチンを呼ぶと、MCDRV が常駐していれば d0.l にバージョンナンバーが、
常駐していなければ -1 が帰って来ます。
KEEPCHECK:
move.l a0,-(sp)
moveq.l #-1,d0
movea.l $90.w,a0 * TRAP #4 のベクタを取得
cmpa.l #$ffffff,a0
bhi keepcheck90
cmpi.l #'-MCD',-12(a0) * 常駐ヘッダチェック
bne keepcheck90
cmpi.l #'RV0-',-8(a0)
bne keepcheck90
move.l -(a0),d0 * バージョンを返す
keepcheck90:
tst.l d0 * ccr にも結果を反映させる
movea.l (sp)+,a0
rts
以下のようにするとスムースな処理になります。
bsr KEEPCHECK
bmi notkeep * 「常駐していない」
cmpi.l #バージョン*$10000,d0 * バージョンチェック
bcs oldversion * 「バージョンが古い」
: * ドライバは異常なし